package com.kaifamiao.strings;

import java.lang.reflect.Field;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * 将字符串内容添加到数组中
 * 1、char[] toCharArray()
 * 2、void getChars(int begin, int end, char[] dst, int dstBegin)
 *    将字符串中[begin, end)之间的字符复制到目标字符数组(dst)的指定位置(dstBegin)
 * 3、了解String实例中所持有的字节数组 (Java9之后)
 */
public class StringToArray {

    public static void main(String[] args) {

        System.out.println( Arrays.toString( args ) );

        String src = "kaifamiao";

        // 根据 字符串 得到与之相应的 字符数组
        char[] chars = src.toCharArray();
        System.out.println( Arrays.toString( chars ) );

        char[] arr = new char[ 10 ];
        System.out.println( Arrays.toString(arr) );

        // 将字符串中指定区间([5,9))的字符复制到目标字符数组(arr)的指定位置(0)
        src.getChars( 5, 9 , arr, 0 );
        System.out.println( Arrays.toString(arr) );

        // 需要为虚拟机添加选项
        // --add-opens java.base/java.lang=ALL-UNNAMED
        byte[] bytes = analyse( src );
        System.out.println( Arrays.toString( bytes ) );

        System.out.println( "- ".repeat( 10 ) );

        String s = "开发喵";
        // 使用反射技术获取 s 所指向字符串内部的 byte 数组
        byte[] value = analyse(s);
        System.out.println( Arrays.toString( value ) );

        byte[] byteArray = { 0, 95, -47, 83, -75, 85 }; // UTF-16LE
        // byteArray === UTF-16LE ==> 字符序列 === UTF-16LE ==> value
        String x = new String( byteArray, StandardCharsets.UTF_16LE );
        System.out.println( x );

        byteArray = new byte[]{-65, -86, -73, -94, -33, -9}; // GBK
        // byteArray === GBK ==> 字符序列 === UTF-16LE ==> value
        x = new String( byteArray, Charset.forName("GBK") );
        System.out.println( x );

    }

    // 这个方法只需要用一下就可以(不需要懂)
    private static byte[] analyse( String s ) {
        if( s == null ){
            return null ;
        }
        byte[] bytes = null;
        Class c = s.getClass();
        try {
            Field valueField = c.getDeclaredField("value");
            valueField.setAccessible( true );
            bytes = (byte[])valueField.get( s ); // 大概相当于 bytes = s.value ;
        } catch ( Exception e ) {
            e.printStackTrace();
        }
        return bytes ;
    }

}
